﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDAL;
using ForrajeriaDB;
using System.Transactions;
using System.Data;

namespace ForrajeriaBCL
{
    public class ForrajeBCL : InterfaceBCL<ForrajeMO>
    {
        private ForrajeDAL forrajeDAL;
        public ForrajeBCL()
        {
            forrajeDAL = ForrajeDAL.Instance; //consumiendo patron SINGLETON
        }
        public List<ForrajeMO> GetAll()
        {
            try
            {

                return forrajeDAL.GetAll();
            }
            catch (Exception ex)
            {
                Exception ez = new  Exception("Error de conexion con la Base de Datos");
                throw (ez);
            }
        }

        public DataTable obtenerProductos()
        {
            try
            {

                return forrajeDAL.obtenerProductos();
            }
            
            catch (Exception ex)
            {
                Exception ez = new Exception("Error de conexion con la Base de Datos");
                throw (ez);
            }
            
        }

        public void modificarStock(List<ForrajeMO> lista)
        {
            try
            {

                foreach (ForrajeMO aux in lista)
                {
                    forrajeDAL.modificarStock(aux.CodigoForraje, aux.StockActual);
                }
            }

            catch (Exception ex)
            {
                Exception ez = new Exception("Error de conexion con la Base de Datos");
                throw (ez);
            }
        }

        public ForrajeMO getById(int id)
        {
            try
            {
                return forrajeDAL.getbyID(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public DataTable buscarProductos(string nom, int edad, int marca)
        {

            try
            {

                return forrajeDAL.buscarProductos(nom, edad, marca);
            }

            catch (Exception ex)
            {
                Exception ez = new Exception("Error de conexion con la Base de Datos");
                throw (ez);
            }
        }
        public string Adicionar(ForrajeMO item)
        {
            try
            {
                forrajeDAL.Adicionar(item);
                return "1";
            }
            catch (Exception ex)
            {
                return "Error de Escritura en Base de Datos";
            }
           
        }

        public string Eliminar(ForrajeMO item)
        {
            try
            {
                forrajeDAL.Eliminar(item);
                return "1";
            }
            catch (Exception ex)
            {
                return "Error de Acceso a Base de Datos";
            }
        }

        public string Actualizar(ForrajeMO itemNuevo, ForrajeMO itemViejo)
        {
            try
            {
                forrajeDAL.Actualizar(itemNuevo, itemViejo);
                return "1";
            }
            catch (Exception ex)
            {
                return "Error Al modificar el Forraje";
            }

        }

        public List<AnimalMO> getDetalle(ForrajeMO item)
        {
            try
            {
                return forrajeDAL.getDetalle(item.CodigoForraje);
            }
            catch
            {
                throw new Exception("Error de Lectura en BD");
            }
        }

        public string AdicionarConDetalle(ForrajeMO item, List<AnimalXForrajeMO> detalle)
        {
            AnimalXForrajeDAL objdetalleDAL = AnimalXForrajeDAL.Instance;
            try
            {
                using (TransactionScope tra = new TransactionScope())
                {
                    int codigoForraje = forrajeDAL.AdicionarConTransaccion(item);

                    foreach (AnimalXForrajeMO aux in detalle)
                    {
                        aux.CodigoForraje = codigoForraje;
                        objdetalleDAL.Adicionar(aux);
                    }

                    tra.Complete();

                }
                return "1";

            }

            catch (Exception ex)
            {
                return "Error de Escritura en la Base de Datos";
            }
        }

        public string ActualizarConDetalle(ForrajeMO itemNuevo, ForrajeMO itemViejo, List<AnimalXForrajeMO> detalle)
        {
            AnimalXForrajeDAL objdetalleDAL = AnimalXForrajeDAL.Instance;
            try
            {

                using (TransactionScope tra = new TransactionScope())
                {
                    forrajeDAL.ActualizarConTransaccion(itemNuevo, itemViejo);

                    foreach (AnimalXForrajeMO aux in detalle)
                    {

                        objdetalleDAL.Eliminar(aux);
                        objdetalleDAL.Adicionar(aux);

                    }

                    tra.Complete();
                 
                }
                return "1";
            }
            catch (Exception ex)
            {
                return "Error Al modificar el Forraje";
            }

        }

        public DataTable reporteForrajeStock(string forraje = "", double stock = 0, bool minimo = false, string ordena = "", string dire = "")
        {
            try
            {
                return forrajeDAL.reporteForrajeStock(forraje, stock, minimo, ordena, dire);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
